package com.kmxd.ams.infra.jobs;

import cn.hutool.core.util.ObjectUtil;
import com.kmxd.ams.client.system.ISysJobsSvc;
import com.kmxd.ams.core.common.enums.JobsEnum;
import com.kmxd.ams.infra.system.entity.SysJobs;
import java.time.LocalDateTime;
import javax.annotation.PostConstruct;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.stereotype.Component;

/**
 * 测试定时任务
 *
 * @author ZuoLG
 */
@Data
@Slf4j
@Component()
public class TestJobs implements SchedulingConfigurer {

  private String cron;
  @Autowired private ISysJobsSvc sysJobsSvc;

  @PostConstruct
  public void init() {
    // 定时任务触发，可修改定时任务的执行周期,将表达式配置在数据库中
    SysJobs sysJobs = sysJobsSvc.getJobsByKey(JobsEnum.TEST_JOBS.getCode());
    if (ObjectUtil.isNotEmpty(sysJobs.getCron())) {
      cron = sysJobs.getCron();
    }
  }

  @Override
  public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
    // 动态使用cron表达式设置循环间隔
    taskRegistrar.addTriggerTask(
        this::execute,
        triggerContext -> {
          // 定时任务触发，可修改定时任务的执行周期,将表达式配置在数据库中
          if (ObjectUtil.isNotEmpty(cron)) {
            CronTrigger trigger = new CronTrigger(cron);
            return trigger.nextExecutionTime(triggerContext);
          }
          return null;
        });
  }

  /** 任务调度方法 */
  public void execute() {
    log.info(
        "执行 【开始】【测试定时任务】，线程名：【{}】，时间:【{}】",
        Thread.currentThread().getName(),
        LocalDateTime.now().toLocalTime());
  }
  // 10 * * * * ?  每5分钟执行
  // 0 0 5 * * ?   每天5点执行
  // 0 0 1 ? * SAT  每周六凌晨1点执行
  // 0 15 10 ? * MON-FRI  周一至周五的上午10:15触发
  // 0 * 10 * * ?   在每天上午10点到10:59期间的每1分钟触发
  // 0 0 10,14,16 * * ?  每天上午10点，下午2点，4点
  // 0 0/30 9-17 * * ?  朝九晚五工作时间内每半小时
  // 0 0 12 ? * WED  表示每个星期三中午12点
  // 0 0 12 * * ?  每天中午12点触发
  // 0 15 10 ? * *  每天上午10:15触发
  // 0 15 10 * * ?  每天上午10:15触发
  // 0 15 10 * * ? 每天上午10:15触发
  // 0 15 10 * * ? 2022  2022年的每天上午10:15触发
  // 0 * 14 * * ?  在每天下午2点到下午2:59期间的每1分钟触发
  // 0 0/5 14 * * ?  在每天下午2点到下午2:55期间的每5分钟触发
  // 0 0/5 14,18 * * ?  在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
  // 0 0-5 14 * * ?  在每天下午2点到下午2:05期间的每1分钟触发
  // 0 10,44 14 ? 3 WED  每年三月的星期三的下午2:10和2:44触发
  // 0 15 10 ? * MON-FRI  周一至周五的上午10:15触发
  // 0 15 10 15 * ?  每月15日上午10:15触发
  // 0 15 10 L * ?  每月最后一日的上午10:15触发
  // 0 15 10 ? * 6L  每月的最后一个星期五上午10:15触发
  // 0 15 10 ? * 6L 2022-2023  2022年至2023年的每月的最后一个星期五上午10:15触发
  // 0 15 10 ? * 6#3  每月的第三个星期五上午10:15触发
  // 0 0 23 * * ?  每天23点执行一次
  // 0 0 1 * * ?  每天凌晨1点执行一次
  // 0 0 1 1 * ?  每月1号凌晨1点执行一次
  // 0 0 23 L * ?  每月最后一天23点执行一次
  // 0 0 1 ? * L  每周星期天凌晨1点实行一次
  // 0 26,29,33 * * * ?  在26分、29分、33分执行一次
  // 0 0 0,13,18,21 * * ?  每天的0点、13点、18点、21点都执行一次

}
